﻿/**
 * 元数据。
 */
Ext.define('Happy.metadata.Metadata', {
    mixins: {
        'metadata-of-form': 'Happy.metadata.mixin.MetadataOfForm',
        'metadata-of-grid': 'Happy.metadata.mixin.MetadataOfGrid',
        'metadata-of-model': 'Happy.metadata.mixin.MetadataOfModel',
        'metadata-of-store': 'Happy.metadata.mixin.MetadataOfStore'
    },
    requires: [
        'Happy.metadata.MetaProperty',
        'Happy.metadata.EditorConfigFns',
        'Happy.metadata.rule.Entity',
        'Happy.metadata.rule.AggregateRoot',
        'Happy.metadata.rule.TreeNode',
        'Happy.metadata.rule.Orderable'
    ],

    constructor: function (config) {
        var me = this;

        config = config || {};
        me.initialConfig = config;

        if (config.data) {
            me.data = config.data
        }
        me.data = Ext.applyIf(me.data || {}, {
            lifeCycle: 'independent',
            isTree: false
        });

        Ext.Object.each(me.data.properties, function (key, value) {
            me.data.properties[key] = Ext.create('Happy.metadata.MetaProperty', me, value);
        });

        me.applyRules();
    },

    /**
     * 应用规则。
     * 
     * @private
     */
    applyRules: function () {
        var me = this;

        Ext.Array.each(me.rules || [], function (rule) {
            if (rule instanceof Ext.Base) {
                rule.applyRule(me);
                return;
            }

            if (Ext.isString(rule)) {
                rule = { type: rule };
            }

            rule = Ext.createByAlias('rule.' + rule.type, rule);
            rule.applyRule(me);
        });
    },

    /**
     * 合并元数据。
     * 
     * @private
     */
    merge: function (data) {
        var me = this;

        Ext.merge(me.data, data);
    },

    /**
     * 返回模型的展示名字。
     * 
     * @return {String}
     */
    getDisplayName: function () {
        var me = this;

        return me.data.displayName || me.data.name;
    },

    /**
     * 生命周期是否独立，如：订单。
     * 
     * @return {Boolean}
     */
    isLifeCycleIndependent: function () {
        var me = this;

        return me.data.lifeCycle === 'independent';
    },

    /**
     * 生命周期是否不独立，如：订单项。
     * 
     * @return {Boolean}
     */
    isLifeCycleDependent: function () {
        var me = this;

        return me.data.lifeCycle === 'dependent';
    },

    /**
     * 是否是树形结构。
     * 
     * @return {Boolean}
     */
    isTree: function () {
        var me = this;

        return me.data.isTree === true;
    },

    /**
     * 返回属性数组。
     * 
     * @return {Array}
     */
    getProperties: function () {
        var me = this;

        return Ext.Object.getValues(me.data.properties);
    }
});